#include <iostream>

using namespace std;

/*
 * 在C语言中，const限定符通常被用来限定变量，用于表示该变量的值不能被修改
 * 而const_cast则正是用于强制去掉这种不能被修改的常数特性，但需要特别注意的是const_cast不是用于去除变量的常量性，而是去除指向常数对象的指针或引用的常量性，其去除常量性的对象必须为指针或引用。
 * 用法：const_cast<type_id> (expression)
 * 说明：
 * 1.该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外， type_id和expression的类型是一样的。
 * 2.常量指针被转化成非常量指针，并且仍然指向原来的对象。
 * 3.常量引用被转换成非常量引用，并且仍然指向原来的对象。
 * */

const int * Search(const int *a, int n, int value);

const int * Search(const int *a, int n, int value)
{
	int i;
	for(i = 0; i < n; i++)
	{
		if(a[i] == value)
		{
			// 渠道对应值的指针，返回出去
			return &a[i];
		}
	}
	return NULL;
}

int main()
{

	const int a = 10;
	const int *p = &a;
	int *q;
	// 去除指针p的const，然后得到q指针
	q = const_cast<int *>(p);
	*q = 20; // 通过q指针修改值，这种方式并不是真的修改a的值，而是一种未定义的语句行为，谨慎使用
	cout << "a: " << a << ", *p: "<< *p << ", *q: " << *q << endl;
	cout << "&a: " << &a << ", p: "<< p << ", q: " << q << endl;

	cout << "----------------------------------------" << endl;
	
	int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
	int value = 6;
	int *pt;
	// 将Search返回的const指针，然后将value对应的指针转成pt指针
	pt = const_cast<int *>(Search(arr, 10, value));
	if(pt)
		cout << "pt not NULL" << endl;
	else 
		cout << " pt is NULL" << endl;
	
	return 0;
}
